Computer applications that store large amounts of data rely on what is known as a backing store to store the data. Examples of backing stores include hard disk drives, storage area networks (SAN), redundant arrays of inexpensive disks (RAID), etc. Memory devices (or “caches”) connected to or otherwise in communication with a backing store are able to store data from the backing store. Storing data from the backing store on the cache allows the data to be quickly accessible to an operating system or other application, improving application performance over accessing the data directly from the backing store. Many backing stores are hard disk devices that have slower read performance than caches such as flash memory devices.
However, conventional backing stores do not provide atomic guarantees for write operations. If a failure occurs in the middle of a write, the backing store may present any combination of old and new data for the affected write operations after the backing store restarts or recovers.